package com.busi.util;



import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;

import org.apache.commons.codec.digest.DigestUtils;

/**
 * 一些跟编码相关的工具方法
 * 
 * @author peng.huang
 * @version 
 */
public class CodesUtil {

	private static final String Encrypt_KEY = "18nnad7f1njdy7f23nadifu23djfdu";

	/**
	 * 加密算法(MD5)
	 * 
	 * @param source
	 *            要加密的字符串
	 * @return
	 */
	public static String encodeMD5(String encryptKey,String source) {
		if (StringUtil.isBlank(source)) {
			return null;
		}

		return DigestUtils.md5Hex(encryptKey + source);
	}

	/**
	 * 判断source和加密后的encodedStr是否匹配
	 * 
	 * @param source
	 * @param encodedStr
	 * @return
	 */
	public static boolean isMatchMD5(String encryptKey,String source, String encodedStr) {
		if (StringUtil.isBlank(source) || StringUtil.isBlank(encodedStr)) {
			return false;
		}

		if (!encodeMD5(encryptKey,source).equals(encodedStr)) {
			return false;
		}

		return true;
	}
	
	
	/**
	 * 加密算法(MD5)
	 * 
	 * @param source
	 *            要加密的字符串
	 * @return
	 */
	public static String encodeMD5(String source) {
		return encodeMD5(Encrypt_KEY,source);
	}

	/**
	 * 判断source和加密后的encodedStr是否匹配
	 * 
	 * @param source
	 * @param encodedStr
	 * @return
	 */
	public static boolean isMatchMD5(String source, String encodedStr) {
		return isMatchMD5(Encrypt_KEY,source,encodedStr);
	}

	/**
	 * 对明文的密码进行杂凑。
	 * 
	 * @param clearPassword
	 *            明文形式的密码。
	 * @return 32位长度，包含0-9及abcdef的密码杂凑值。如果发生错误，则返回null。
	 */
	public static String encodePassword(String clearPassword) {
		return encodeMD5(clearPassword);
	}
	

	/**
	 * 判断明文密码与杂凑密码是否相同。
	 * 
	 * @param clearPassword
	 *            明文形式的密码。
	 * @param encodedPassword
	 *            杂凑形式的密码。
	 * @return 如果明文密码与杂凑形式的密码匹配，则返回true，否则返回false。如果任一参数为null，则返回false。
	 */
	public static boolean isPasswordEqual(String clearPassword,
			String encodedPassword) {
		return isMatchMD5(clearPassword, encodedPassword);
	}



	/**
	 * 检查日期是否有效。
	 * 
	 * @param year
	 * @param month
	 * @param day
	 * @return
	 */
	public static boolean checkDate(int year, int month, int day) {
		if ((year < 1900) || (year > getCurrentYear())) {
			return false;
		}

		if ((month < 1) || (month > 12)) {
			return false;
		}

		Calendar cal = new GregorianCalendar();

		cal.set(year, month - 1, 1);

		if ((day < 1) || (day > cal.getActualMaximum(Calendar.DAY_OF_MONTH))) {
			return false;
		}

		return true;
	}

	/**
	 * 取得当前年份。
	 * 
	 * @return
	 */
	public static int getCurrentYear() {
		Calendar cal = new GregorianCalendar();

		cal.setTime(new Date());
		return cal.get(Calendar.YEAR);
	}

	/**
	 * 10的n次幂
	 * 
	 * @param count
	 * @return
	 */
	public static int getTenPower(int n) {
		int j = 1;

		for (int i = 0; i < n; i++) {
			j = 10 * j;
		}

		return j;
	}

	/**
	 * 取一个整数的第n位,第一位为个位，第二位为十位...
	 * 
	 * @param valut
	 * @param bit
	 * 
	 * @return
	 */
	public static int getFailCount(int value, int bit) {
		int i = value % getTenPower(bit);

		if (i >= 10) {
			return i / getTenPower(bit - 1);
		} else {
			return i;
		}
	}

	/**
	 * 给一个整数的第n位加指定的值，返回该整数
	 * 
	 * @param valut
	 * @param bit
	 * 
	 * @return
	 */
	public static int setFailCount(int value, int bit, int bitValue) {
		int j = getFailCount(value, bit);
		int n = getTenPower(bit - 1);

		return value - (j * n) + (bitValue * n);
	}

	/**
	 * 判断一个字符串在不在另外一个里面
	 * 
	 * @param str
	 * @param strList
	 * @param splitChar
	 * @return
	 */
	public static boolean isStrInStrList(String str, String strList,
			String splitChar) {
		if (StringUtil.isEmpty(str) || StringUtil.isEmpty(strList)) {
			return false;
		}

		String[] strs = strList.split(splitChar);

		for (int i = 0; i < strs.length; i++) {
			if (str.equals(strs[i])) {
				return true;
			}
		}

		return false;
	}

	/**
	 * 组合两个字符串
	 * 
	 * @param str
	 * @param strList
	 * @param splitChar
	 * @return
	 */
	public static String composeStr(String str, String strList, String splitChar) {
		if (StringUtil.isEmpty(strList)) {
			return str;
		}

		if (StringUtil.isEmpty(str)) {
			return strList;
		}

		return strList + splitChar + str;
	}
	public static byte[] LongToBinOrderByte(Integer promotedType){
		
		String promotedTypeBin = Long.toBinaryString(promotedType);
		Vector v = new Vector() ;
		for(byte i=0;i<promotedTypeBin.length();i++){
			if( promotedTypeBin.substring(i,i+1).equals("1") ) {
				v.add((byte)(promotedTypeBin.length()-i));
			}
		}
		byte[] b = new byte[v.size()];
		for(int i=0;i<v.size();i++){
			b[i] = (Byte)v.get(i);
		}
		return b ;
	}
	
	/**
	 * 按照key的升序排列
	 *
	 *
	 * @param messageTemplate
	 * @return
	 */
	public static String assemble(Map messageTemplate) {
		StringBuffer content = new StringBuffer(126);
		List keys = new ArrayList(messageTemplate.keySet());
		Collections.sort(keys);

		// 组装成一串参数
		for (int i = 0; i < keys.size(); i++) {
			String key = (String)keys.get(i);
			Object valueObj=messageTemplate.get(key);
			String value="";
			if(valueObj instanceof String){
			 value = (String)messageTemplate.get(key);
			}
			else if(valueObj instanceof String[]){
			 String temp[]	= (String[])messageTemplate.get(key);
			    for(int jj=0;jj<temp.length;jj++){
			    	if(jj>0){
			    	  value=","+temp[jj];
			    	}
			    	else{
			    	  value=temp[jj];
			    	}
			    }
			}
			content.append(((i == 0) ? "" : "&") + key + "=" + value);
		}

		return content.toString();
	}
	 /**
     * @return paramString
     * 按照key的升序排列
     */
	public static String getParamString(Map messageTemplate) {
       
        StringBuffer content = new StringBuffer();
        List keys = new ArrayList(messageTemplate.keySet());
        Collections.sort(keys);

        //组装成一串参数
        for (int i = 0; i < keys.size(); i++) {
            String key = String.valueOf(keys.get(i));
            String value = encode(String.valueOf(messageTemplate.get(key)));
            content.append(((i == 0) ? "" : "&") + key + "=" + value);
        }

        return content.toString();
    }
    public  static String encode(String s) {
        String ret = s;

        try {
            ret = URLEncoder.encode(s, "GBK");
            //ret = ret.replaceAll("\\+", "%2B");
        } catch (Exception e) {
            //ignore
        }

        return ret;
    }
    
    public static Map recoverToMap(String paramString){
    	 Map map = new HashMap() ;
    	 if(paramString==null)
    		 return null;
    	 String[] params=paramString.split("&");
    	 for(int i=0;i<params.length;i++){
    		 String[] paramObjec=params[i].split("=");
    		 map.put(paramObjec[0], paramObjec[1]);
    	 }
    	 
    	 return map;
    }
	public static void main(String[] args){
		//System.err.print(CodesUtil.encodePassword("123456"));
		LongToBinOrderByte(12583424);
	}

}

